Amazon EventBridge SchedulerでCloudFrontのキャッシュクリア自動化を試してみました(Lambda不使用)
こんにちは。AWS 事業本部コンサルティング部に所属している今泉(@bun76235104)です。
先日にAWSの新機能としてAmazon EventBridge Schedulerがリリースされました。
非常に多くのサービスと連携しており、弊社でもさまざまな使い方が考えられているところで、非常に可能性を感じます。
従来であればLambdaを作成するなどの方策が必要だった「CloudFrontのキャッシュクリアの自動化」をAmazon EventBridge Schedulerを使って簡単に実装してみました。
参考: CloudFrontのキャッシュを定期的に自動削除してみた | DevelopersIO
下準備:CloudFrontを立てる(S3オリジン)
まずはCloudFrontのディストリビューションを作成しました。
以下のようにS3をオリジンとしています。
S3には以下のようにJSONファイル(test.json)を配置しておきます。
{ "famous_words": [ { "char": "pop", "words": "一瞬…!!だけど…閃光のように…!!!まぶしく燃えて生き抜いてやる!!!" }, { "char": "pop", "words": "・・・そう!!おれを呼ぶなら大魔導士とでも呼んでくれっ!!!" }, { "char": "dai", "words": "・・・おまえは昔から天才だよっ!!ポップ!!!" } ] }
CloudFrontにリクエストを送って、ちゃんとキャッシュされているか確かめてみます。
curl https://${ディストリビューションのドメイン名}/test.json
レスポンスBodyは以下のように意図したJSONが返却されました。
{ "famous_words": [ { "char": "pop", "words": "一瞬…!!だけど…閃光のように…!!!まぶしく燃えて生き抜いてやる!!!" }, { "char": "pop", "words": "・・・そう!!おれを呼ぶなら大魔導士とでも呼んでくれっ!!!" }, { "char": "dai", "words": "・・・おまえは昔から天才だよっ!!ポップ!!!" } ] }
また、初回のリクエストであったためレスポンスヘッダを確認したところCloudFrontにキャッシュが無いようです。
HTTP/2 200 # 略 server: AmazonS3 x-cache: Miss from cloudfront # ↑キャッシュがヒットしなかった
何度かリクエストをするうちに、キャッシュヒットするようになったことを確認しました。
server: AmazonS3 x-cache: Hit from cloudfront # ↑キャッシュヒットした
これで下準備は完了です。
次はAmazon EventBridge Schedulerを使ってキャッシュクリアの自動化を実装していきます。
Amazon EventBridge Schedulerでスケジュールを組む
まずはAWSマネジメントコンソールのAmazon EventBridgeのダッシュボードからSchedulesの画面に移動します。
次にスケジュールの作成画面に遷移します。
入力欄にスケジュール名や説明などを入力していきます。
今回は以下画像のように5分間隔の実行をしていしてみました。
CloudFrontをターゲットとして選択します。
CloudFrontのCreateInvalidationをターゲットとして選択します。
次にAPIに渡すパラメータを定義するJSONを作成します。
今回は以下のように指定しています。
{ "DistributionId": "ディストリビューションのID", "InvalidationBatch": { "CallerReference": "auto-<aws.scheduler.scheduled-time>", "Paths": { "Quantity": 1, "Items": ["/*"] } } }
なお、aws.scheduler.scheduled-time
はEventBridge Schedulerで利用できるキーワードです。
呼び出し時の時間に置き換えてくれます。
他にもいくつかキーワードを用意してくれていますので、興味のある方はご確認ください。
「次へ」をクリックします。
次に以下のようにスケジュールの設定画面に遷移します。
今回は再試行ポリシーなどは特に設定していませんが、アクセス許可であらかじめ作成していたIAMロールを選択しています。
IAMロールは以下のようにポリシーと信頼ポリシーを設定しています。
IAMポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": "cloudfront:CreateInvalidation", "Resource": "arn:aws:cloudfront::${アカウントID}:distribution/${ディストリビューションID}" } ] }
信頼ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
確認画面で問題なければ、「スケジュールを作成」をクリックします。
確認
7分後くらいにCloudFrontのディストリビューションを確認したところ、きっちりキャッシュ削除が行われていました。
curlでもキャッシュヒットしていないことが確認できました!
server: AmazonS3 x-cache: Miss from cloudfront
また、5分後に確認してもキャッシュが削除されていることを確認できました。
このままだと5分ごとにスケジュールが走るので、忘れずにスケジュールを無効化します。
まとめ
- CloudFrontのキャッシュクリアのスケジュール化がLambdaいらずで実装できた
- Amazon EventBridge Schedulerには大いなる可能性がある
- さまざまなサービスのAPIと連携している
- これまでEventBridge + Lambdaで頑張っていたことをLambdaを作らないで良いかも